package model.proxy
{
	import model.AnneeEtude;
	import model.AnneeUniversitaire;
	import model.Enseignement;
	import model.Utilisateur;
	import model.proxy.LoginProxy;
	
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.remoting.mxml.RemoteObject;
	
	import org.puremvc.as3.interfaces.IProxy;
	import org.puremvc.as3.patterns.proxy.Proxy; 
	
	public class EnseignementProxy extends Proxy implements IProxy 
	{
		public static const NAME : String = 'EnseignementProxy';
		
		public static const LISTE_ANNEES_ETUDE_OBTENUE : String = "ListeAnneesEtudeObtenueEnseignement";
		public static const LISTE_ENSEIGNEMENTS_OBTENUE : String = "ListeEnseignementsObtenue";
		public static const LISTE_TYPES_ENSEIGNEMENT_OBTENUE : String = "ListeTypesEnseignementObtenue";
		public static const LISTE_MATIERES_OBTENUE : String = "ListeMatieresObtenue";
		public static const LISTE_ANNEES_UNIV_OBTENUE : String = "ListeAnneesUnivObtenueEnseignement";
				
		private var remoteObjectEnseignement : RemoteObject = null;
		private var remoteObjectMatiere : RemoteObject = null;
		private var remoteObjectTypeEnseignement : RemoteObject = null;
		private var remoteObjectAnneeEtude : RemoteObject = null;
		private var remoteObjectAnneeUniversitaire : RemoteObject = null;
		
		
		public function EnseignementProxy(data:Object=null) 
		{ 
			super(NAME, data);
			
			remoteObjectEnseignement = new RemoteObject();
			remoteObjectEnseignement.destination = "RemoteServiceEnseignement";
			remoteObjectEnseignement.source = "RemoteServiceEnseignement";
			remoteObjectEnseignement.endpoint = ApplicationFacade.SERVEUR;

			remoteObjectMatiere = new RemoteObject();
			remoteObjectMatiere.destination = "RemoteServiceMatiere";
			remoteObjectMatiere.source = "RemoteServiceMatiere";
			remoteObjectMatiere.endpoint = ApplicationFacade.SERVEUR;
			
			remoteObjectTypeEnseignement = new RemoteObject();
			remoteObjectTypeEnseignement.destination = "RemoteServiceTypeEnseignement";
			remoteObjectTypeEnseignement.source = "RemoteServiceTypeEnseignement";
			remoteObjectTypeEnseignement.endpoint = ApplicationFacade.SERVEUR;
			
			remoteObjectAnneeEtude = new RemoteObject();
			remoteObjectAnneeEtude.destination = "RemoteServiceAnneeEtude";
			remoteObjectAnneeEtude.source = "RemoteServiceAnneeEtude";
			remoteObjectAnneeEtude.endpoint = ApplicationFacade.SERVEUR;
			
			remoteObjectAnneeUniversitaire = new RemoteObject();
			remoteObjectAnneeUniversitaire.destination = "RemoteServiceAnneeUniversitaire";
			remoteObjectAnneeUniversitaire.source = "RemoteServiceAnneeUniversitaire";
			remoteObjectAnneeUniversitaire.endpoint = ApplicationFacade.SERVEUR;			
		}
		
 		/************************************************** REMOTING **************************************************/
 		
 		public function obtenirListeAnneesEtude(anneeUniversitaire : AnneeUniversitaire) : void
 		{
  			remoteObjectAnneeEtude.addEventListener(ResultEvent.RESULT, listeAnneesEtudeObtenue);
			remoteObjectAnneeEtude.addEventListener(FaultEvent.FAULT, onFault);
 			var utilisateur:Utilisateur = LoginProxy.user;
 			remoteObjectAnneeEtude.obtenirListeAnneesEtudeUser(utilisateur, anneeUniversitaire);		
 		}
 		
 		public function obtenirListeEnseignements(annee:AnneeEtude) : void 
 		{
 			remoteObjectEnseignement.addEventListener(ResultEvent.RESULT, listeEnseignementsObtenue);
			remoteObjectEnseignement.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectEnseignement.obtenirListeEnseignements(annee);
 		}

 		public function obtenirListeTypesEnseignement() : void 
 		{
 			remoteObjectTypeEnseignement.addEventListener(ResultEvent.RESULT, listeTypesEnseignementObtenue);
			remoteObjectTypeEnseignement.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectTypeEnseignement.obtenirListeTypesEnseignement();
 		}
 		
 		public function obtenirListeMatieres(annee:AnneeEtude):void
 		{
 			remoteObjectMatiere.addEventListener(ResultEvent.RESULT, listeMatieresObtenue);
			remoteObjectMatiere.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectMatiere.obtenirListeMatieres(annee);			
 		}
 		
 		public function obtenirListeAnneesUniversitaire() : void 
 		{
 			remoteObjectAnneeUniversitaire.addEventListener(ResultEvent.RESULT, listeAnneesUniversitaireObtenue);
			remoteObjectAnneeUniversitaire.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectAnneeUniversitaire.obtenirListeAnneesUniversitaire();
 		}
 		
 		public function validerAjoutEnseignement(enseignement:Enseignement):void
 		{
 			remoteObjectEnseignement.addEventListener(ResultEvent.RESULT, listeEnseignementsObtenue);
			remoteObjectEnseignement.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectEnseignement.ajouterEnseignement(enseignement); 				
 		}
 		
 		public function validerModifEnseignement(enseignement:Enseignement):void
 		{
 			remoteObjectEnseignement.addEventListener(ResultEvent.RESULT, listeEnseignementsObtenue);
			remoteObjectEnseignement.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectEnseignement.modifierEnseignement(enseignement);			
 		}

 		public function supprimerEnseignement(enseignement:Enseignement):void
 		{
 			remoteObjectEnseignement.addEventListener(ResultEvent.RESULT, listeEnseignementsObtenue);
			remoteObjectEnseignement.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectEnseignement.supprimerEnseignement(enseignement);	
 		}
 		
 		/************************************************** RESULTAT **************************************************/
 		
 		private function listeAnneesEtudeObtenue(event:ResultEvent):void
 		{
 			remoteObjectAnneeEtude.removeEventListener(ResultEvent.RESULT, listeAnneesEtudeObtenue);
			var listeAnneesEtude:Array = (event.result as Array)
			sendNotification(LISTE_ANNEES_ETUDE_OBTENUE, listeAnneesEtude); 			
 		}

		private function listeEnseignementsObtenue(event:ResultEvent):void
		{
			remoteObjectEnseignement.removeEventListener(ResultEvent.RESULT, listeEnseignementsObtenue);
			var listeEnseignements:Array = (event.result as Array)
			sendNotification(LISTE_ENSEIGNEMENTS_OBTENUE, listeEnseignements);
		}
		
		private function listeTypesEnseignementObtenue(event:ResultEvent):void
		{
			var listeTypesEnseignement:Array = (event.result as Array)
			sendNotification(LISTE_TYPES_ENSEIGNEMENT_OBTENUE, listeTypesEnseignement);
		}
		
		private function listeMatieresObtenue(event:ResultEvent):void
		{
			var listeMatieres:Array = (event.result as Array)
			sendNotification(LISTE_MATIERES_OBTENUE, listeMatieres);
		}
		
		private function listeAnneesUniversitaireObtenue(event:ResultEvent):void
		{
			remoteObjectAnneeUniversitaire.removeEventListener(ResultEvent.RESULT, listeAnneesUniversitaireObtenue);
			var listeAnneesUniversitaire:Array = (event.result as Array)
			sendNotification(LISTE_ANNEES_UNIV_OBTENUE, listeAnneesUniversitaire);
		}
		
		private function onFault(event:FaultEvent):void
		{
			trace("Fault");
		}		
	}
}